package cn.pkubangbang.demo.democontact.service;

import cn.pkubangbang.demo.democontact.entity.Person;
import cn.pkubangbang.demo.democontact.entity.Role;
import cn.pkubangbang.demo.democontact.interceptor.TooFrequentRequestException;
import cn.pkubangbang.demo.democontact.service.impl.helper.Threshold;
import java.io.UnsupportedEncodingException;
import java.util.Set;

/**
 * @Author: zhangzhenbang@k2data.com.cn
 * @Date: 2018-08-24 16:13
 */
public interface AuthService {

    /**
     * 检查X-Auth-Token是否过期
     * @param xHeader X-Auth-Token
     * @return true 如果仍然可用； false如果已然失效
     */
    boolean getPermission(String xHeader);

    /**
     * 获取xHeader对应的Threshold
     * @param xHeader
     * @return
     */
    Threshold getThreshold(String xHeader);

    /**
     * 清除过期的请求记录，并增加一次请求记录。如果请求过于频繁，抛出异常。
     * @param xHeader X-Auth-Token
     * @throws TooFrequentRequestException 如果操作过于频繁
     */
    void touch(String xHeader) throws TooFrequentRequestException;

    /**
     * 使当前token失效，并且禁用当前账户一段时间
     * @param xHeader X-Auth-Token
     */
    void invalid(String xHeader);

    /**
     * 返回用户的角色（这个方法是用代码模拟的，常规的方式是使用数据库）
     * @param p 用户
     * @return 用户拥有的角色，是个Set
     */
    Set<Role> getRoles(Person p);

    /**
     * 根据用户信息生成token。token的格式不限，但需兼容header的字符规范。
     * @param p person
     * @return token
     */
    String generateToken(Person p) throws UnsupportedEncodingException;
}
